#include "linkedlist.h"

/* 打印链表 */
void print_linked_list(const Node *head) {
  printf("{ %d", head->value);
  while (head->next) {
    head = head->next;
    printf(" -> %d", head->value);
  }
  puts(" }");
}

/* 新建节点（初始化节点） */
Node *new_node(int val) { 
  Node *node;
  node = (Node *) malloc(sizeof(Node));
  node->value = val;
  node->next = NULL;
  return node;
}

/* 插入节点 将新节点p插入到n0节点之后 */
void insert_node(Node *n0, Node *p) {
  Node *n1 = n0->next;
  p->next = n1;
  n0->next = p;
}

/* 删除节点 删除n0的后继节点 */
void remove_node(Node *n0) {
  if (!n0->next) return; // 传入的节点必须要有后继
  Node *p = n0->next;
  Node *n1 = p->next;
  n0->next = n1;
  free(p); // 释放内存
}

/* 访问节点 访问指定索引的节点*/
Node *access_node(Node *head, int index) {
  for (int i = 0; i < index; i++) {
    if (head->next) head = head->next;
    else return NULL;
  }
  return head;
}

/* 查找节点 */
int find_node(const Node *head, int target) {
  int index = 0;
  while (head) {
    if (head->value == target) return index;
    head = head->next;
    index++;
  }
  return -1;
} 
